/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE and NOTICE files at the root of the source
 * tree and available online at
 *
 * http://www.dspace.org/license/
 */

/**
 * Copyright (c) 2007, Aberystwyth University
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  - Redistributions of source code must retain the above
 *    copyright notice, this list of conditions and the
 *    following disclaimer.
 *
 *  - Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 *  - Neither the name of the Centre for Advanced Software and
 *    Intelligent Systems (CASIS) nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */
package org.purl.sword.client;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;

/**
 * Dialog that prompts the user to enter the details for a service
 * document location.
 *
 * @author Neil Taylor
 */
public class ServiceDialog {
    /**
     * The username.
     */
    private SWORDComboBox username;

    /**
     * The password.
     */
    private JPasswordField password;

    /**
     * Holds the URL for the collection.
     */
    private SWORDComboBox location;

    /**
     * The combo box that shows the list of onBehalfOf items.
     */
    private SWORDComboBox onBehalfOf;

    /**
     * Parent frame for the dialog.
     */
    private JFrame parentFrame = null;

    /**
     * The panel that holds the controls.
     */
    private JPanel controls = null;

    /**
     * List of buttons.
     */
    private static Object[] options = {"Get Service Document", "Cancel"};

    /**
     * Create a new instance.
     *
     * @param parentFrame The parent frame. The dialog will be shown over the
     *                    centre of this frame.
     */
    public ServiceDialog(JFrame parentFrame) {
        this.parentFrame = parentFrame;
        controls = createControls();
    }

    /**
     * Show the dialog.
     *
     * @return The close option. This is one of the dialog options from
     * JOptionPane.
     */
    public int show() {
        int result = JOptionPane.showOptionDialog(parentFrame,
                                                  controls,
                                                  "Get Service Document",
                                                  JOptionPane.OK_CANCEL_OPTION,
                                                  JOptionPane.PLAIN_MESSAGE,
                                                  null,
                                                  options,
                                                  options[1]);

        if (result == JOptionPane.OK_OPTION) {
            // update the combo boxes with the values
            username.updateList();
            location.updateList();
            onBehalfOf.updateList();
        }

        return result;
    }

    /**
     * Create the controls that are displayed in the dialog.
     *
     * @return The panel that contains the controls.
     */
    protected final JPanel createControls() {
        username = new SWORDComboBox();
        username.setEditable(true);
        password = new JPasswordField();
        location = new SWORDComboBox();
        location.setEditable(true);
        onBehalfOf = new SWORDComboBox();
        onBehalfOf.setEditable(true);

        JLabel userLabel = new JLabel("Username:", JLabel.TRAILING);
        JLabel passwordLabel = new JLabel("Password:", JLabel.TRAILING);
        JLabel locationLabel = new JLabel("Location:", JLabel.TRAILING);
        JLabel onBehalfOfLabel = new JLabel("On Behalf Of:", JLabel.TRAILING);

        SWORDFormPanel panel = new SWORDFormPanel();
        panel.addFirstRow(userLabel, username);
        panel.addRow(passwordLabel, password);
        panel.addRow(locationLabel, location);
        panel.addRow(onBehalfOfLabel, onBehalfOf);

        return panel;
    }

    /**
     * Get the username from the controls on the dialog.
     *
     * @return The username.
     */
    public String getUsername() {
        return username.getText();
    }

    /**
     * Get the password from the dialog.
     *
     * @return The password.
     */
    public String getPassword() {
        return new String(password.getPassword());
    }

    /**
     * The location from the dialog.
     *
     * @return The location.
     */
    public String getLocation() {
        return location.getText();
    }

    /**
     * The onBehalfOf value from the dialog.
     *
     * @return The onBehalfOf value.
     */
    public String getOnBehalfOf() {
        String text = onBehalfOf.getText().trim();
        if (text.length() == 0) {
            return null;
        }
        return text;
    }

    /**
     * Add the list of user ids to the dialog.
     *
     * @param users The list of user ids.
     */
    public void addUserIds(String[] users) {
        username.insertItems(users);
    }

    /**
     * Add the list of service URLs.
     *
     * @param services The service URLs.
     */
    public void addServiceUrls(String[] services) {
        location.insertItems(services);
    }

    /**
     * Add a list of onBehalfOf names.
     *
     * @param users The list of onBehalfOf items.
     */
    public void addOnBehalfOf(String[] users) {
        onBehalfOf.insertItems(users);
    }

}
